import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart';


/* 
flutter 更新的密码
Rx 是 GetX 提供的一种响应式机制
简单来说，Rx 包装了一个普通值，使得它能在值发生变化时自动更新 UI 而Int本身不具备响应式

RxInt（以及 Rx 类型的其他数据，比如 RxDouble, RxString 等）是 GetX 提供的响应式对象，它本质上是对普通数据类型的封装。
封装后的 RxInt 是一个对象，你不能直接获取它的值，而是需要通过 .value 来访问该值。
类似vue3 ref

 */

// CartItem 类，count 被包装为 RxInt，响应式。当 count 的值改变时，UI 将自动更新。
class CartItem {
  int id;
  RxInt count;
  double price;

  CartItem({required this.id, required int count, required this.price}) : count = count.obs; // 转换为 RxInt

  // 转换为 Map 用于存储  toJson 方法将 CartItem 转换为可以存储的 Map
  Map<String, dynamic> toJson() => {'id': id, 'count': count.value, 'price': price};

  // 从 Map 恢复  fromJson 方法用于从存储的 Map 恢复 CartItem。这里直接从 Map 中获取 count 的值，并传递给 CartItem 构造函数，count 会变成 RxInt 类型。
  factory CartItem.fromJson(Map<String, dynamic> json) => CartItem(id: json['id'], count: json['count'], price: json['price']);
}

class CartController extends GetxController {
  final box = GetStorage();

  // 初始化购物车列表  响应式 
  RxList<CartItem> cartList = <CartItem>[].obs;

  // 总价格  响应式
  RxDouble totalPrice = 0.0.obs;

  @override
  void onInit() {
    super.onInit();

    // 从本地存储恢复购物车数据
    List storedCart = box.read('cartList') ?? [];
    cartList.value = storedCart.map((e) => CartItem.fromJson(e)).toList();

    if (cartList.isEmpty) {
      cartList.addAll([
        CartItem(id: 1, count: 2, price: 3),
        CartItem(id: 2, count: 1, price: 5),
      ]);
      _updateStorage(); // 更新存储
    }

    calculateTotalPrice(); // 计算初始总价
  }

  // 添加商品
  void addItem(int id, int count, double price) {
    cartList.add(CartItem(id: id, count: count, price: price));
    _updateStorage();
    calculateTotalPrice();
  }

  // 删除商品
  void removeItem(int id) {
    cartList.removeWhere((item) => item.id == id);
    _updateStorage();
    calculateTotalPrice();
  }

  // 更新商品数量
  void updateItemCount(int id, int newCount) {
    final item = cartList.firstWhere((element) => element.id == id);
    item.count.value = newCount; // 更新 RxInt 的值
    _updateStorage();
    calculateTotalPrice();
  }

  // 计算总价格
  void calculateTotalPrice() {
    totalPrice.value = cartList.fold(
      0.0,
      (sum, item) => sum + (item.count * item.price),
    );
  }

  // 更新持久化存储
  void _updateStorage() {
    box.write('cartList', cartList.map((e) => e.toJson()).toList());
  }
}
